<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="../static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="../static/css/sb-admin-2.css">
<link href="../static/prettify/github-v2.min.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
      <script src="../static/js/html5shiv.min.js"></script>
      <script src="../static/js/respond.min.js"></script>
    <![endif]-->
<style>
body {
	word-wrap: break-word;
}
</style>
</head>
<body onload="prettyPrint();">
	<div id="nav"></div>

	<div id="page-wrapper" style="padding: 10px">
		<div class="container-fluid">
			<div class="row">
				<div class="col-md-12">
					<p>一个页面可以有多个标签，它们决定了一个页面的行为和数据，标签主要有以下几种：</p>
					<h2>事务标签</h2>
					<p>基本引用形式</p>
					<pre class="prettyprint lang-xml">&lt;!--开启一个事务--&gt;
&lt;transaction:begin/&gt;
&lt;!--结束一个事务--&gt;
&lt;transaction:end/&gt;</pre>
					<div class="alert alert-warning">
						<ul>
							<li>事务始终是只读的</li>
							<li>渲染过程中支持开启多个事务，但是只能在一个事务关闭之后开启另一个</li>
							<li>可以不显示的指定&lt;transaction:end/&gt;标签，当页面渲染结束时，会自动关闭已经存在的事务</li>
						</ul>
					</div>
					<p>
						&lt;transaction:begin/&gt;标签支持isolationLevel属性，该属性为一个int值，默认为-1，根据数据库的不同隔离级别也不同
						(mysql默认为Repeatable Read)，该属性可选值如下：</p>
					<div class="table-responsive">
						<table class="table">
							<tbody>
								<tr>
									<td>ISOLATION_DEFAULT</td>
									<td>默认隔离级别，跟数据库有关</td>
									<td>-1</td>
								</tr>
								<tr>
									<td>ISOLATION_READ_UNCOMMITTED</td>
									<td>读取未提交内容</td>
									<td>1</td>
								</tr>
								<tr>
									<td>ISOLATION_READ_COMMITTED</td>
									<td>读取已提交内容</td>
									<td>2</td>
								</tr>
								<tr>
									<td>ISOLATION_REPEATABLE_READ</td>
									<td>可重复读</td>
									<td>4</td>
								</tr>
								<tr>
									<td>TRANSACTION_SERIALIZABLE</td>
									<td>可串行化</td>
									<td>8</td>
								</tr>
							</tbody>
						</table>
					</div>

					<h2 id="redirect">重定向标签</h2>
					<p>
						重定向标签用于页面间的跳转，&lt;redirect
						url=""/&gt;是一个最基本的重定向标签，被重定向后，已经被解析的数据不会被保存，所以<b>重定向标签应该尽可能的在页面顶部引用</b>，重定向标签支持的属性如下：
					</p>
					<div class="table-responsive">
						<table class="table">
							<thead>
								<tr>
									<th>属性</th>
									<th>可以省略</th>
									<th>默认值</th>
									<th>说明</th>
								</tr>
							</thead>
							<tbody>
								<tr>
									<td>url</td>
									<td>否</td>
									<th></th>
									<td>跳转地址，支持相对路径</td>
								</tr>
								<tr>
									<td>permanently</td>
									<td>是</td>
									<td>false</td>
									<td>是否是永久跳转(301跳转)，否则是302重定向，如果是301，将无法携带信息</td>
								</tr>
								<tr>
									<td>code</td>
									<td>是</td>
									<td></td>
									<td>信息code</td>
								</tr>
								<tr>
									<td>argumentSpliter</td>
									<td>是</td>
									<td>,</td>
									<td>用于分割参数的字符</td>
								</tr>
								<tr>
									<td>arguments</td>
									<td>是</td>
									<td></td>
									<td>填补信息占位符的参数</td>
								</tr>
								<tr>
									<td>defaultMsg</td>
									<td>是</td>
									<td></td>
									<td>默认信息</td>
								</tr>
							</tbody>
						</table>
					</div>
					<p>在302跳转中，如果携带了信息，可以在目标页面中通过 &#36;{redirect_page_msg}来获取信息</p>


					<h2>fragment标签</h2>
					<p>模板片段标签，引用形式为&lt;fragment
						name=""/&gt;，其中name属性为模板片段名称，在实际的渲染过程中，通过当前空间和模板名称来确定fragment</p>
					<div class="alert alert-info">
						fragment标签实际上会被转化成&lt;div th:replace="" &gt;&lt;/div&gt;<br>因此name属性可以使用选择器，例如&lt;fragment
						name="nav :: li"/&gt;
					</div>

					<h2>lock标签</h2>
					<p>
						lock标签的引用形式为：&lt;lock id="" /&gt;其中id为锁的id，当解析到lock标签时，如果<b>锁存在并且用户没有登录并且用户没有打开过该锁</b>，那么将会被重定向至解锁页面，解锁成功后方可浏览该页面
					</p>
					<div class="alert alert-warning">
						1.一个页面可以有多把锁<br>2.跟redirect标签相同，应该尽可能的让这个标签第一时间被解析
					</div>
					<div class="alert alert-info">
						lock标签支持type属性，如果该属性值为block，那么lock标签下还支持两个额外的标签：locked和unlocked，
						locked标签里面的内容将会在用户没有解锁时渲染，unlocked标签中的内容会在用户解锁后渲染。locked标签内还可以通过${urls.getUnlockUrl(lock,urls.getFullUrl(#request))}来获取解锁地址
						<p>注意事项：</p>
						<ul>
							<li><span class="text text-warning">lock标签不支持嵌套</span></li>
							<li><span class="text text-warning">
									locked和unlocked标签必须在lock内使用</span></li>
							<li><span class="text text-warning">
									lock与访问路径无关</span></li>
						</ul>
					</div>


					<h2>private标签</h2>
					<p>
						引用形式为:&lt;private/&gt;被该标签标记的页面只有登录后才能被浏览，未登录将会抛出
						<code>AuthencationException</code>
						异常，同样也应该让它尽可能的第一时间被解析
					</p>

					<div class="alert alert-warning">
						<b><i>无论是lock标签还是private标签，它们都是决定一个页面被解析时候的行为，而不是决定一个页面的属性，如果在页面允许评论的情况下，哪怕用户没有登录并且无法解开页面的锁，都可以正常评论这个页面，所以这些标签仅仅保护页面内容，而无法保护跟页面关联的东西(例如评论)</i></b>
					</div>

					<h2>
						data标签[<a href="data/index.html">查看数据标签</a>]
					</h2>
					<p>数据标签是页面获取数据的主要来源，引用形式：&lt;data
						name="标签名"/&gt;，标签有两个基本的属性，name和dataName，name用来查找标签，dataName用来传递数据，
						例如&lt;data name="文章列表"
						dataName="articlePage"/&gt;，在标签之后可以通过&#36;{articlePage}来获取结果，dataName可以作为属性在data标签上设置，一旦设置，将会
						忽略默认的dataName，这在某些情况下可能很有用，例如评论查询</p>
					<p>所有的标签名称和默认的dataName都可以在resource/spring/ui.xml中配置</p>
					<p>关于data标签的ajax访问：</p>
					<p>
						如果需要data数据被ajax访问，那么可以设置DataTagProcessor的属性callable为true，<b>该操作重启容器之后才会生效</b>，
						然后通过访问/data/标签名或者/space/{space}/data/标签名，来获取ajax结果，标签属性可以通过键值对的形式来设置，例如：
						<a href="https://www.qyh.me/data/文章日期归档?mode=YMD" target="_blank">https://www.qyh.me/data/文章日期归档?mode=YMD</a>，或者
						<a href="https://www.qyh.me/space/life/data/文章日期归档?mode=YMD"
							target="_blank">https://www.qyh.me/space/life/data/文章日期归档?mode=YMD</a>
					</p>



					<h2>MediaType标签</h2>
					<p>mediaType标签可以用来决定一个路径的资源类型，例如</p>
					<pre class="prettyprint lang-xml">&lt;mediaType value=&quot;application/json&quot;/&gt;
&lt;data name=&quot;文章列表&quot; th:query=&quot;${param.query}&quot;/&gt;
&lt;div th:utext=&quot;${jsons.write(articlePage)}&quot; th:remove=&quot;tag&quot;&gt;
  
&lt;/div&gt;</pre>
					<p>将会将文章列表以json形式输出</p>
					<div class="alert alert-warning">
						一个页面可以放置任意多个&lt;mediaType/&gt;标签，但最终以最后一个被解析的mediaType标签为准</div>


					<h2>period标签</h2>
					<p>该标签主要用来在指定时间段内执行内容，标签的基本访问形式为：&lt;period begin="" end=""
						include="true"&gt;&lt;/period&gt;，该标签接受以下几个参数：</p>
					<div class="table-responsive">
						<table class="table">
							<thead>
								<tr>
									<th>属性</th>
									<th>可以省略</th>
									<th>默认值</th>
									<th>说明</th>
								</tr>
							</thead>
							<tbody>
								<tr>
									<td>begin</td>
									<td>是</td>
									<th></th>
									<td>开始日期(关于可以接受的日期格式，请见<a
										href="/doc/appendix.html#accpet-datetime" target="_blank">接受的日期格式</a>)
									</td>
								</tr>
								<tr>
									<td>end</td>
									<td>是</td>
									<td></td>
									<td>结束日期(关于可以接受的日期格式，请见<a
										href="/doc/appendix.html#accpet-datetime" target="_blank">接受的日期格式</a>,<b>开始日期以及结束日期必须指定一个或者两个才能使标签工作</b>)
									</td>
								</tr>
								<tr>
									<td>include</td>
									<td>是</td>
									<td>true</td>
									<td>如果为true，则在begin~end时间段内无法访问，否则只能在begin~end时间段内访问</td>
								</tr>
							</tbody>
						</table>
					</div>
					<p>如果在指定时间段内，period标签中的内容将会被解析，否则period标签将会被忽略，例如下面的标签将会在，2018-01-01
						00:00:00~2018-01-02 00:00:00这段时间内跳转到首页</p>

					<pre class="prettyprint lang-xml">
&lt;period begin=&quot;2018-01-01&quot; end=&quot;2018-01-02&quot;&gt;
      &lt;redirect th:url=&quot;${urls.url}&quot;/&gt;
&lt;/period&gt;
					</pre>


					<h2 id="markdown">markdown标签</h2>
					<p>该标签内的内容将会通过markdown来渲染</p>
					<div class="alert alert-warning">
						markdown标签内的标签以及表达式将不会再被执行，例如
						<pre class="prettyprint lang-xml">
&lt;markdown&gt;
	&lt;h2 th:text=&quot;${articlePage}&quot;&gt;&lt;/h2&gt;
&lt;/markdown&gt;		</pre>
						此时th:text将不会被执行，如果需要使用表达式，可以采用内联表达式，例如：
						<pre class="prettyprint lang-xml">
&lt;markdown&gt;
	&lt;h2&gt;[[${articlePage}]]&lt;/h2&gt;
&lt;/markdown&gt;		</pre>
					</div>
				</div>
			</div>
		</div>
	</div>
</body>

<script type="text/javascript" src="../static/jquery/jquery.min.js"></script>
<script type="text/javascript"
	src="../static/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="../static/prettify/prettify.js"></script>
<script>
	$(function() {
		$("#nav").load("nav.html");
	});
</script>
</html>